[파이썬 플라스크] WSGI 란?
업데이트:
Web Server Gateway Interface, WSGI
WSGI란 무엇일까.
공식 문서에는 “웹 서버가 웹 애플리케이션과 통신하는 방법과 웹 애플리케이션을 연결하여 하나의 요청을 처리하는 방법에 대한 설명서” 라고 나와있다.
여러 종류의 웹 서버와 여러 종류의 웹 애플리케이션이 모두 통신이 가능하도록 하기 위한 규약이라고 보면 된다. 이를 이해하기 위해 먼저 웹 서버와 웹 애플리케이션에 대해 알아보자.
웹 서버와 웹 애플리케이션
💡 참고: 웹 서버는 하드웨어와 소프트웨어 측면의 의미가 있는데, 아래에서는 소프트웨어로서의 의미를 다룬다. — 관련 링크
웹 서버는 클라이언트의 정적 웹 페이지 요청을 처리하는 프로그램을 말한다. 대표적인 웹 서버로는 Apache, Nginx 등이 있다.
웹 애플리케이션(또는 웹 애플리케이션 서버, WAS)은 웹 서버가 동적 웹 페이지 요청을 처리할 수 있게 도와주는 역할을 한다. (웹 애플리케이션이 해당 요청을 처리한 결과를 웹 서버에게 돌려준다.)
정적 웹 페이지와 동적 웹 페이지
정적 웹 페이지는 서버에 이미 만들어진 (저장된) 페이지나 파일이 그대로 전달되는 페이지이고, 동적 웹 페이지는 서버의 데이터를 스크립트가 가공하여 만들어 주는 페이지이다. 언제 어디서든 같은 페이지를 보여준다면 정적 웹 페이지, 사용자의 요청이나 시간 등에 따라 변한다면 동적 웹 페이지이다.
사실 간단하게 구분하자면 데이터베이스의 유무가 되지 않을까..
- 정적 웹 페이지 : 회사 소개, 학교 소개, …
- 동적 웹 페이지 : 게시판, 뉴스, 날씨, …
여기서 핵심은 동적인 웹 페이지를 만들기 위해서는 웹 서버와 웹 애플리케이션이 서로 소통을 해야 한다는 것이다.
지금까지 Flask를 이용하여 웹 애플리케이션을 만들어보았다. 이제 웹 서버와 소통을 하면 되는데, 대부분의 웹 서버는 파이썬 코드를 이해하지 못한다고 한다. 그렇기 때문에 WSGI가 필요한 것이다.
WSGI 역할
위에서 웹 서버는 파이썬 프로그램을 호출하지 못한다고 했다. 그러나 WSGI를 이용한다면 가능하다. 흐름은 아래와 같다.
WSGI 서버: 파이썬 프로그램 호출이 가능한 서버, 대표적으로 uWSGI, Gunicorn 등이 있다.
WSGI 애플리케이션: WSGI를 만족하는 웹 애플리케이션, Flask, django 등이 있다.
WSGI를 만족?
- 웹 서버는 요청 정보를 Callable Object를 통해 애플리케이션에 전달한다.
- Callable Object는 함수나 객체가 될 수 있다.
- HTTP Request 정보와 Callback 함수를 전달해야 한다.
- 웹 애플리케이션은 요청을 처리 후, 웹 서버에 반환한다.
- HTTP Request → 요청 처리
- Callback Funtion → 결과 반환
위와 같은 인터페이스를 구현한 애플리케이션을 WSGI 애플리케이션이라고 한다.
직접 구현할 필요는 없다. WSGI Middleware가 제공하기 때문이다.
- 클라이언트가 동적 웹 페이지 요청을 보낸다.
- 웹 서버는 WSGI 서버를 호출한다.
- WSGI 서버는 WSGI 애플리케이션을 호출한다.
- WSGI 애플리케이션은 요청을 처리한다.
- 수행 결과를 WSGI 서버 → 웹 서버 → 클라이언트에게 보낸다.
WSGI Middleware
WSGI 자체로는 서버나 프레임워크가 아니다. 파이썬 프로그램을 이해할 수 있게 해주는 번역기 역할을 하는 것이다. 그렇기 때문에 웹 개발 시 공통적으로 필요한 기능들(라우팅, 인증, 세션, 쿠키 등)을 매번 구현해야 한다.
WSGI 미들웨어는 웹 애플리케이션 실행 전, 후에 위에서 말한 기능들을 추가해준다. 또한 그 자체로도 WSGI 애플리케이션이다.
WSGI 미들웨어의 역할을 하는 라이브러리로는 uWSGI, Gunicorn, Werkzeug 등이 있다.
Werkzeug
Werkzeug는 Flask에서 기본적으로 사용하는 WSGI 미들웨어로, WSGI 미들웨어 역할 뿐만 아니라 웹 서버의 역할을 할 수도 있다. 따라서 별다른 설정 없이도 Flask 앱을 실행할 수 있다.
따라서 Flask는 이미 WSGI 애플리케이션이라고 할 수 있다. 하지만 단순한 개발용 서버를 내장하고 있기 때문에 프로덕션에서는 다른 것으로 대체해야 한다고 한다.
요약
웹 서버는 정적인 페이지만 처리할 수 있다. 동적인 페이지는 웹 애플리케이션을 통해 처리하게 된다.
WSGI는 웹 서버와 웹 애플리케이션이 통신하기 위한 규약이라 생각하면 된다. 대부분의 웹 서버는 파이썬 프로그램을 이해하지 못하기 때문이다. WSGI라는 번역기가 웹 서버와 파이썬 프로그램이 소통할 수 있게 해준다.
참고
https://tibetsandfox.tistory.com/22
https://wikidocs.net/75556#wsgi
https://velog.io/@han0707/WSGI는-무엇일까
https://spoqa.github.io/2012/01/16/wsgi-and-flask.html
댓글남기기